from rest_framework.response import Response
from rest_framework import status as status_code
from django.http.response import JsonResponse
from functools import wraps

def include_chinese(func):
    """
    在类视图调用的函数,用于需要返回中文格式的JSON数据视图中，仅限装饰GET函数
    :param func: 返回数据类型的get函数
    :return:    response对象
    """
    def _warps(self, request, *args, **kwargs):
        data = func(self, request, *args, **kwargs)
        f = request.GET.get("format", None)
        if f == "json":  # JSON情况下返回JSON数据
            return JsonResponse(data, safe=False)
        # elif f == "api":      # 还有一个api的选项不知道是干什么用的，所以暂留个空，不作处理
        #     pass
        else:  # 默认情况正常返回rest_framework序列化数据
            return Response(data, status=status_code.HTTP_200_OK)
    return _warps


def check_permission(permission):
    """
    此装饰器用于验证用户权限是否存在
    需要传递一个参数，访问API所需要的权限集，列表形式
    :param permission:
    :return:
    """
    def wrapper(func):
        @wraps(func)
        def content(request, *args, **kwargs):
            if not hasattr(request, "user"):
                user_functions = args[0].user.get_all_function()
            else:
                user_functions = request.user.get_all_function()
            if not set(permission).difference(set(user_functions)):
                # 求出两个列表的差集，代表访问需要的权限在用户的所有权限列表中是否存在
                # 如果需要的权限存在用户权限集，则这条语句的返回空值，代表用户的权限验证通过，反之则权限不足

                return func(request, *args, **kwargs)
            else:
                return Response({"message": "權限不足！"}, status=status_code.HTTP_202_ACCEPTED)
        return content
    return wrapper

